<?php

declare(strict_types=1);

namespace addons\WeChat\driver;

use addons\WeChat\exception\WeChatException;
use WeChat\Oauth;
use WeChat\Script;
use WeChat\Template;
use WeChat\User;

class WeChat
{

    /**
     * @var mixed 微信配置参数
     */
    protected $config;

    public function __construct()
    {
        $this->config = config('pay')['wx_wechat'];
    }

    /**
     * @param $redirect_url
     * @param $state
     * @param $scope - 授权类类型(可选值snsapi_base - 获取openid用|snsapi_userinfo - 获取微信用户信息用)
     * @return string
     * @throws WeChatException
     * 原点 2022年12月8日15:38:24 微信公众号授权跳转接口
     */
    public function getOauthRedirect($redirect_url, $state = '', $scope = 'snsapi_base')
    {
        try {
            return Oauth::instance($this->config)->getOauthRedirect($redirect_url, $state, $scope);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }


    /**
     * @param $code
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:40:15 获取openid,静默授权(需getOauthRedirect方法scope需为 snsapi_base)
     */
    public function getOauthAccessToken($code)
    {
        try {
            return Oauth::instance($this->config)->getOauthAccessToken($code);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }

    /**
     * @param $access_token
     * @param $openid
     * @param $lang
     * @return array
     * @throws WeChatException
     * 原点 2022年12月8日15:43:21 拉取用户信息(需getOauthRedirect方法scope需为 snsapi_userinfo)
     */
    public function getUserInfo($access_token, $openid, $lang = 'zh_CN')
    {
        try {
            return Oauth::instance($this->config)->getUserInfo($access_token, $openid, $lang);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }
    /**
     * 微信分享获取Ticket
     */
    public function getTicket($type = 'jsapi', $appid = null)
    {
        try {
            return Script::instance($this->config)->getTicket($type, $appid);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }
    /**
     * 微信分享获取签名参数
     */

    public function getJsSign($url, $appid = null, $ticket = null, $jsApiList = null)
    {
        try {
            return Script::instance($this->config)->getJsSign($url, $appid, $ticket, $jsApiList);
        } catch (\Exception $e) {
            throw new WeChatException('获取失败：' . $e->getMessage(), -1);
        }
    }
    
    /**
    * data 参数内容
    * 微信公众号发送消息模板
    * touser:接受消息模板用户
    * template_id:模板id
    * url:跳转路径
    * data:参数内容
    * miniprogram：[appid：小程序appid ；pagepath：小程序跳转路径]
    */
   public function wechatTemplateSend($data)
   {
       try {
           return Template::instance($this->config)->send($data);
       } catch (\Exception $e) {
           throw new WeChatException('加载失败：' . $e->getMessage(), -1);
       }
   }
   //微信公众号获取模板列表
   public function getAllPrivateTemplate()
   {
       try {
           return Template::instance($this->config)->getAllPrivateTemplate();
       } catch (\Exception $e) {
           throw new WeChatException('加载失败：' . $e->getMessage(), -1);
       }
   }
    /**
     * 获取用户基本信息（包括UnionID机制）
     */
    public function getUserInfoList($openid, $lang = 'zh_CN')
    {
        try {
            return User::instance($this->config)->getUserInfo($openid, $lang);
        } catch (\Exception $e) {
            throw new WeChatException('加载失败：' . $e->getMessage(), -1);
        }
    }
}
